home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / scsi_transport_iscsi.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  9.1 KB  |  248 lines

  1. /*
  2.  * iSCSI transport class definitions
  3.  *
  4.  * Copyright (C) IBM Corporation, 2004
  5.  * Copyright (C) Mike Christie, 2004 - 2006
  6.  * Copyright (C) Dmitry Yusupov, 2004 - 2005
  7.  * Copyright (C) Alex Aizman, 2004 - 2005
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22.  */
  23. #ifndef SCSI_TRANSPORT_ISCSI_H
  24. #define SCSI_TRANSPORT_ISCSI_H
  25.  
  26. #include <linux/device.h>
  27. #include <linux/list.h>
  28. #include <linux/mutex.h>
  29. #include <scsi/iscsi_if.h>
  30.  
  31. struct scsi_transport_template;
  32. struct iscsi_transport;
  33. struct iscsi_endpoint;
  34. struct Scsi_Host;
  35. struct iscsi_cls_conn;
  36. struct iscsi_conn;
  37. struct iscsi_task;
  38. struct sockaddr;
  39.  
  40. /**
  41.  * struct iscsi_transport - iSCSI Transport template
  42.  *
  43.  * @name:        transport name
  44.  * @caps:        iSCSI Data-Path capabilities
  45.  * @create_session:    create new iSCSI session object
  46.  * @destroy_session:    destroy existing iSCSI session object
  47.  * @create_conn:    create new iSCSI connection
  48.  * @bind_conn:        associate this connection with existing iSCSI session
  49.  *            and specified transport descriptor
  50.  * @destroy_conn:    destroy inactive iSCSI connection
  51.  * @set_param:        set iSCSI parameter. Return 0 on success, -ENODATA
  52.  *            when param is not supported, and a -Exx value on other
  53.  *            error.
  54.  * @get_param        get iSCSI parameter. Must return number of bytes
  55.  *            copied to buffer on success, -ENODATA when param
  56.  *            is not supported, and a -Exx value on other error
  57.  * @start_conn:        set connection to be operational
  58.  * @stop_conn:        suspend/recover/terminate connection
  59.  * @send_pdu:        send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text.
  60.  * @session_recovery_timedout: notify LLD a block during recovery timed out
  61.  * @init_task:        Initialize a iscsi_task and any internal structs.
  62.  *            When offloading the data path, this is called from
  63.  *            queuecommand with the session lock, or from the
  64.  *            iscsi_conn_send_pdu context with the session lock.
  65.  *            When not offloading the data path, this is called
  66.  *            from the scsi work queue without the session lock.
  67.  * @xmit_task        Requests LLD to transfer cmd task. Returns 0 or the
  68.  *            the number of bytes transferred on success, and -Exyz
  69.  *            value on error. When offloading the data path, this
  70.  *            is called from queuecommand with the session lock, or
  71.  *            from the iscsi_conn_send_pdu context with the session
  72.  *            lock. When not offloading the data path, this is called
  73.  *            from the scsi work queue without the session lock.
  74.  * @cleanup_task:    requests LLD to fail task. Called with session lock
  75.  *            and after the connection has been suspended and
  76.  *            terminated during recovery. If called
  77.  *            from abort task then connection is not suspended
  78.  *            or terminated but sk_callback_lock is held
  79.  *
  80.  * Template API provided by iSCSI Transport
  81.  */
  82. struct iscsi_transport {
  83.     struct module *owner;
  84.     char *name;
  85.     unsigned int caps;
  86.     /* LLD sets this to indicate what values it can export to sysfs */
  87.     uint64_t param_mask;
  88.     uint64_t host_param_mask;
  89.     struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep,
  90.                     uint16_t cmds_max, uint16_t qdepth,
  91.                     uint32_t sn, uint32_t *hn);
  92.     void (*destroy_session) (struct iscsi_cls_session *session);
  93.     struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess,
  94.                 uint32_t cid);
  95.     int (*bind_conn) (struct iscsi_cls_session *session,
  96.               struct iscsi_cls_conn *cls_conn,
  97.               uint64_t transport_eph, int is_leading);
  98.     int (*start_conn) (struct iscsi_cls_conn *conn);
  99.     void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
  100.     void (*destroy_conn) (struct iscsi_cls_conn *conn);
  101.     int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param,
  102.               char *buf, int buflen);
  103.     int (*get_conn_param) (struct iscsi_cls_conn *conn,
  104.                    enum iscsi_param param, char *buf);
  105.     int (*get_session_param) (struct iscsi_cls_session *session,
  106.                   enum iscsi_param param, char *buf);
  107.     int (*get_host_param) (struct Scsi_Host *shost,
  108.                 enum iscsi_host_param param, char *buf);
  109.     int (*set_host_param) (struct Scsi_Host *shost,
  110.                    enum iscsi_host_param param, char *buf,
  111.                    int buflen);
  112.     int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
  113.              char *data, uint32_t data_size);
  114.     void (*get_stats) (struct iscsi_cls_conn *conn,
  115.                struct iscsi_stats *stats);
  116.     int (*init_task) (struct iscsi_task *task);
  117.     int (*xmit_task) (struct iscsi_task *task);
  118.     void (*cleanup_task) (struct iscsi_conn *conn,
  119.                   struct iscsi_task *task);
  120.     void (*session_recovery_timedout) (struct iscsi_cls_session *session);
  121.     struct iscsi_endpoint *(*ep_connect) (struct sockaddr *dst_addr,
  122.                           int non_blocking);
  123.     int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms);
  124.     void (*ep_disconnect) (struct iscsi_endpoint *ep);
  125.     int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type,
  126.               uint32_t enable, struct sockaddr *dst_addr);
  127. };
  128.  
  129. /*
  130.  * transport registration upcalls
  131.  */
  132. extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt);
  133. extern int iscsi_unregister_transport(struct iscsi_transport *tt);
  134.  
  135. /*
  136.  * control plane upcalls
  137.  */
  138. extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn,
  139.                    enum iscsi_err error);
  140. extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
  141.               char *data, uint32_t data_size);
  142.  
  143. struct iscsi_cls_conn {
  144.     struct list_head conn_list;    /* item in connlist */
  145.     void *dd_data;            /* LLD private data */
  146.     struct iscsi_transport *transport;
  147.     uint32_t cid;            /* connection id */
  148.  
  149.     int active;            /* must be accessed with the connlock */
  150.     struct device dev;        /* sysfs transport/container device */
  151. };
  152.  
  153. #define iscsi_dev_to_conn(_dev) \
  154.     container_of(_dev, struct iscsi_cls_conn, dev)
  155.  
  156. #define iscsi_conn_to_session(_conn) \
  157.     iscsi_dev_to_session(_conn->dev.parent)
  158.  
  159. /* iscsi class session state */
  160. enum {
  161.     ISCSI_SESSION_LOGGED_IN,
  162.     ISCSI_SESSION_FAILED,
  163.     ISCSI_SESSION_FREE,
  164. };
  165.  
  166. #define ISCSI_MAX_TARGET -1
  167.  
  168. struct iscsi_cls_session {
  169.     struct list_head sess_list;        /* item in session_list */
  170.     struct iscsi_transport *transport;
  171.     spinlock_t lock;
  172.     struct work_struct block_work;
  173.     struct work_struct unblock_work;
  174.     struct work_struct scan_work;
  175.     struct work_struct unbind_work;
  176.  
  177.     /* recovery fields */
  178.     int recovery_tmo;
  179.     struct delayed_work recovery_work;
  180.  
  181.     unsigned int target_id;
  182.  
  183.     int state;
  184.     int sid;                /* session id */
  185.     void *dd_data;                /* LLD private data */
  186.     struct device dev;    /* sysfs transport/container device */
  187. };
  188.  
  189. #define iscsi_dev_to_session(_dev) \
  190.     container_of(_dev, struct iscsi_cls_session, dev)
  191.  
  192. #define iscsi_session_to_shost(_session) \
  193.     dev_to_shost(_session->dev.parent)
  194.  
  195. #define starget_to_session(_stgt) \
  196.     iscsi_dev_to_session(_stgt->dev.parent)
  197.  
  198. struct iscsi_cls_host {
  199.     atomic_t nr_scans;
  200.     struct mutex mutex;
  201.     struct workqueue_struct *scan_workq;
  202.     char scan_workq_name[20];
  203. };
  204.  
  205. extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
  206.                 void (*fn)(struct iscsi_cls_session *));
  207.  
  208. struct iscsi_endpoint {
  209.     void *dd_data;            /* LLD private data */
  210.     struct device dev;
  211.     uint64_t id;
  212. };
  213.  
  214. /*
  215.  * session and connection functions that can be used by HW iSCSI LLDs
  216.  */
  217. #define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \
  218.     dev_printk(prefix, &(_cls_session)->dev, fmt, ##a)
  219.  
  220. #define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \
  221.     dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a)
  222.  
  223. extern int iscsi_session_chkready(struct iscsi_cls_session *session);
  224. extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost,
  225.                 struct iscsi_transport *transport, int dd_size);
  226. extern int iscsi_add_session(struct iscsi_cls_session *session,
  227.                  unsigned int target_id);
  228. extern int iscsi_session_event(struct iscsi_cls_session *session,
  229.                    enum iscsi_uevent_e event);
  230. extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost,
  231.                         struct iscsi_transport *t,
  232.                         int dd_size,
  233.                         unsigned int target_id);
  234. extern void iscsi_remove_session(struct iscsi_cls_session *session);
  235. extern void iscsi_free_session(struct iscsi_cls_session *session);
  236. extern int iscsi_destroy_session(struct iscsi_cls_session *session);
  237. extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess,
  238.                         int dd_size, uint32_t cid);
  239. extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn);
  240. extern void iscsi_unblock_session(struct iscsi_cls_session *session);
  241. extern void iscsi_block_session(struct iscsi_cls_session *session);
  242. extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time);
  243. extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size);
  244. extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep);
  245. extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle);
  246.  
  247. #endif
  248.